#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

#include "ohos_init.h"
#include "cmsis_os2.h"
#include "base_FSR.h"

#include "hi_uart.h"
#include "hi_io.h"
#include "iot_gpio.h"
extern float f;           //水流量
extern float temperature; //水温
extern 
unsigned char FLY_STATUS_DATA[FLY_Len][9] =
    {
        {0xaa, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa},
        {0xaa, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xac}};

FSR_recv_data RecvFSR;
FSR_recv_data *const pRecvFSR = &RecvFSR; // FSR解析输出缓存区,该指针指向固定的地址
FSR_send_data SendFSR;
FSR_send_data *const pSendFSR = &SendFSR;

char TCP_RX_BUF[BUF_MAX]; // TCP接收缓存区
char TCP_TX_BUF[BUF_MAX]; // TCP发送缓存区
char UART_RX_BUF[BUF_MAX];
/*************************************
功能：FSR指令数据解析
作者：xinxue
日期：2023.11.8
参数：pRecvFSR
返回值：1 - 校验位正确, 0 - 校验位出错,数据无效
**************************************/
int FSR_ReceiveHandle(void)
{
    int cnt, pos = 0;
    for (cnt = 0; TCP_RX_BUF[cnt] != '\0'; cnt++)
    {
        if (TCP_RX_BUF[cnt] == ',') //','为间隔帧
        {
            pos++;
            cnt++;
            // 计算当前数据位长度
            int len = 0;
            do
            {
                if (TCP_RX_BUF[cnt + len] == ',' || TCP_RX_BUF[cnt + len] == '*')
                    break;
            } while (++len);
            // 校验位保存
            if (TCP_RX_BUF[cnt + len] == '*')
            {
                pRecvFSR->SumCheck = strtol(TCP_RX_BUF + cnt + len + 1, NULL, 16);
            }
            // 存储其余数据位
            switch (pos)
            {
            case 1:
            { /*第一个参数*/
                memset(pRecvFSR->Status, 0, 10);
                strncpy(pRecvFSR->Status, TCP_RX_BUF + cnt, len);
                cnt = cnt + len - 1;
                break;
            }
            case 2:
            {
                /*第二个参数*/
                pRecvFSR->Height = atoi(TCP_RX_BUF + cnt);
                cnt = cnt + len - 1;
                break;
            }
            case 3:
            {
                /*第三个参数*/
                pRecvFSR->X1 = atoi(TCP_RX_BUF + cnt);
                cnt = cnt + len - 1;
                break;
            }
            case 4:
            {
                /*第四个参数*/
                pRecvFSR->Y1 = atoi(TCP_RX_BUF + cnt);
                cnt = cnt + len - 1;
                break;
            }
            default:
                break;
            }
        }
    }
    // 校验位计算
    int checksum = 0;
    for (int i = 1; TCP_RX_BUF[i] != '*'; i++)
    {
        checksum = checksum ^ TCP_RX_BUF[i];
    }
    printf("Data:%s,%d,%d,%d\n", pRecvFSR->Status, pRecvFSR->Height, pRecvFSR->X1, pRecvFSR->Y1);
    memset(TCP_RX_BUF, 0, sizeof TCP_RX_BUF); // 清空接收缓存区
    if (checksum == pRecvFSR->SumCheck)
        return 1;
    else
        return 0;
}
/*************************************
功能：FSR发送数据处理
作者：xinxue
日期：2023.11.8
参数：
返回值：
**************************************/
void FSR_TransmitHandle(void)
{
    sprintf(TCP_TX_BUF, "$FSR,%x,A,,,,,,%.3f,%.2f,%.2f,%.2f,%d*", pSendFSR->DeviceFlag, pSendFSR->Water,pSendFSR->Humidness,pSendFSR->Temperature,pSendFSR->PH,pSendFSR->WateValue);
    // 校验位计算
    pSendFSR->SumCheck = 0;
    for (int i = 1; TCP_TX_BUF[i] != '*'; i++)
    {
        pSendFSR->SumCheck = pSendFSR->SumCheck ^ TCP_TX_BUF[i];
    }
    // 融合数据
    sprintf(TCP_TX_BUF + strlen(TCP_TX_BUF), "%x", (unsigned char)pSendFSR->SumCheck);
    // printf("%s\n", TCP_TX_BUF);
}
/*************************************
功能：串口接收无人机数据
作者：xinxue
日期：2023.11.8
参数：
返回值：
备注:无人机发送的数据(小端序存储)
| 帧头(16位) | Type(16位) | 坐标x(16位) | 坐标y(16位) |  高度(16位) |
**************************************/
void FSR_UART_ReceiveHandle(void)
{
    if (UART_RX_BUF[2] != 0x05)
    {
        printf("UART TYPE ERROR!\n");
        return;
    }
    pSendFSR->Point_X = (short)((UART_RX_BUF[5] & 0xFF << 8) + UART_RX_BUF[4] & 0xFF);
    pSendFSR->Point_Y = (short)((UART_RX_BUF[7] & 0xff<< 8) + UART_RX_BUF[6]);
    pSendFSR->Height = (short)((UART_RX_BUF[9] & 0xFF << 8) + UART_RX_BUF[8] & 0xFF);
    if(pSendFSR->Height==255)
        pSendFSR->Height = 0;
}
/*************************************
功能：控制串口发送无人机数据
作者：xinxue
日期：2023.11.8
参数：起飞指令:FLY_Start ,急停指令:FLY_Stop
返回值：
**************************************/
void FSR_UART_ToFLY(FLY_STATUS status)
{
    for (int i = 0; i < 3; i++)
    {
        hi_uart_write(HI_UART_IDX_2, (unsigned char *)FLY_STATUS_DATA[status], 9);
        usleep(10 * 1000); // 10ms
    }
}
/*************************************
功能：串口和设备号初始化
作者：xinxue
日期：2023.11.8
参数：设备号
返回值：
**************************************/
void FSR_Init(int DeviceFlag)
{
    pSendFSR->DeviceFlag = DeviceFlag; // 设置设备号
    strcat(pSendFSR->Status, "stop");

    IoTGpioInit(11);
    IoTGpioInit(12);
    hi_io_set_func(HI_IO_NAME_GPIO_11, HI_IO_FUNC_GPIO_11_UART2_TXD);
    hi_io_set_func(HI_IO_NAME_GPIO_12, HI_IO_FUNC_GPIO_12_UART2_RXD);
    hi_uart_attribute g_uart_cfg =
        {
            .baud_rate = 57600,
            .data_bits = 8,
            .stop_bits = 1,
            .parity = 0,
        };
    int ret = hi_uart_init(HI_UART_IDX_2, &g_uart_cfg, NULL);
    printf("init:%d\n", ret);
}
/*************************************
功能：更新灌溉系统数据
作者：zhengyi
日期：2023.11.8
参数：
返回值：
备注:无人机发送的数据(小端序存储)
| 帧头(16位) | Type(16位) | 坐标x(16位) | 坐标y(16位) |  高度(16位) |
**************************************/
void FSR_UPdate(void)
{
    
    pSendFSR->Point_X = (short)((UART_RX_BUF[5] & 0xFF << 8) + UART_RX_BUF[4] & 0xFF);
    pSendFSR->Point_Y = (short)((UART_RX_BUF[7] & 0xff<< 8) + UART_RX_BUF[6]);
    pSendFSR->Height = (short)((UART_RX_BUF[9] & 0xFF << 8) + UART_RX_BUF[8] & 0xFF);
    if(pSendFSR->Height==255)
        pSendFSR->Height = 0;
}